﻿using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Drawing;

namespace GieldaCSharp
{
    class Component
    {

        private double maxY;
        private double minY;

        private int N;
        protected int iOd;
        protected int iDo;

        private int size;

        Border b;
        Graphics g;
        PictureBox p;

        public List<Wykres> wykresy = new List<Wykres>(); // lista wykresow
        public List<int> przeskalowanaY = new List<int>();
        public List<int> przeskalowanaX = new List<int>();
        private List<kursV> lista = new List<kursV>();

        public Component(PictureBox _p, List<kursV> _lista, Border _b, Graphics _g, int _N, int _iOd, int _iDo, int _size)
        {
            p = _p;
            b = _b;
            g = _g;
            N = _N;
            iOd = _iOd;
            iDo = _iDo;

            size = _size;

            lista = _lista;
        }

        public Component(PictureBox _p, Border _b, Graphics _g, int _N, int _iOd, int _iDo)
        {
            p = _p;
            b = _b;
            g = _g;
            N = _N;
            iOd = _iOd;
            iDo = _iDo;
        }
        
        private void MaxMin() //Liczy wartosci minY i maxY dla wszystkich wykresow
        {
            if (0 == wykresy.Count) return;

            maxY = wykresy[0].Max(iOd, iDo);
            minY = wykresy[0].Min(iOd, iDo);

            for (int i = 1; i < wykresy.Count; i++)
            {
                if (wykresy[i].Max(iOd, iDo) > maxY) maxY = wykresy[i].Max(iOd, iDo);
                if (wykresy[i].Min(iOd, iDo) < minY) minY = wykresy[i].Min(iOd, iDo);
            }
        }

        private int PrzeskalujY(double kurs)
        {
            int zYn = b.maxYn - b.minYn;
            return (zYn - (Convert.ToInt32((Convert.ToDouble(kurs - minY) / Convert.ToDouble(maxY - minY)) * Convert.ToDouble(zYn)) - b.minYn));
        }

        private int PrzeskalujX(double x)
        {
            return ((Convert.ToInt32((Convert.ToDouble(x) / Convert.ToDouble(N)) * Convert.ToDouble(b.maxXn - b.minXn)) + b.minXn));
        }

        public void Przeskaluj()
        {
            for (int i = 0; i < lista.Count; i++)
            {
                przeskalowanaY.Add(PrzeskalujY(lista[i].kurs));
                przeskalowanaX.Add(PrzeskalujX(lista[i].x - iOd));
            }
        }

        public void Draw()
        {
            if (0 == wykresy.Count) return;

            MaxMin();
            Przeskaluj();

            for (int i = 0; i < wykresy.Count; i++)
            {
                wykresy[i].Draw(p, g, maxY, minY, N);
            }                      
        }

        public void DrawBall(int ind, Graphics gPb)
        {
            Rectangle rec = new Rectangle(przeskalowanaX[ind] - size, przeskalowanaY[ind] - size, 2 * size, 2 * size); // Wymiary i polozenie kropki

            gPb.FillEllipse(Brushes.DarkOrange, rec); // Rysujemy kropke
            gPb.DrawEllipse(new Pen(Color.Orange, 1), rec);
        }

    }
}
